package com.pl.interceptor.config;

import com.pl.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

//    非常重要的提示：
//    Springboot中只能有一个 WebMvcConfigurationSupport 配置类是真正起作用的，
//    对于这个问题，其实可以通过implements WebMvcConfigurer来解决，多个不同的类实现这个接口后的配置都可以正常运行。
//    1.继承 WebMvcConfigurationSupport 类的方式可以用在前后端分离的项目中，后台不需要访问静态资源（就不需要放开静态资源了）；
//    2.实现 WebMvcConfigure 接口的方式可以用在非前后端分离的项目中，因为需要读取一些图片、css、js文件等等。

/**
 * 在 Spring Boot 2.0 之前，我们都是直接继承 WebMvcConfigurerAdapter 类，
 * 然后重写 addInterceptors 方法来实现拦截器的配置。
 * 但是在 Spring Boot 2.0 之后，该方法已经被废弃了（当然，也可以继续用），
 * 取而代之的是 WebMvcConfigurationSupport 方法，如下：
 *
 * @author shent
 */
@Configuration
public class MyInterceptorConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        //addPathPatterns 方法是添加要拦截的请求，这里我们拦截所有的请求
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }

    //下面两个方法是 WebMvcConfigurationSupport 中常用的覆盖的方法

    /**
     * 跨域访问配置接口
     *
     * @param registry
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .allowCredentials(true)
                .allowedHeaders("*")
                .maxAge(3600);
        super.addCorsMappings(registry);
    }


    //    坑坑坑，重点：
    //    1.默认的资源映射，不能缺少，不然默认的static目录将不能访问！
    //    2.配置"/image/“路径时，我第一次配置成”/image*/"，但是我static目录恰巧有个资源目录叫做images，
    //    这时导致配置失败，默认路径和外部资源配置功能都不能正常使用，因此，配置外部路径时一定不能和工程内部的目录有重名，或者有能适配上的名字。
    //    3. 一个项目中：只能存在一个 WebMvcConfigurationSupport。不能存在多个，请切记！！！
    //配置文件路径
    @Value("${file.uploadFolder}")
    private String uploadFolder;

    /**
     * 静态资源处理
     *
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //使得 knife4j 可以访问
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        //默认的资源映射需要填写，不然不能正常访问
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        //配置外部资源目录的映射，/image目录为前端访问的路径，后面配置静态资源的绝对路径
        registry.addResourceHandler("/image/**").addResourceLocations("file:" + uploadFolder);
        System.out.println("静态资源处理成功,文件路径:" + uploadFolder);
    }

    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController("/plant-api", "doc.html");
    }
}
